package hyl.prod.task;

import java.io.File;
import java.io.UnsupportedEncodingException;
import java.util.HashMap;
import java.util.Map;
import com.alibaba.fastjson2.JSON;

import hyl.core.MyDate;
import hyl.core.MyFun;
import hyl.core.io.MyFile;

public class TaskLog {

	public static final String S初始化任务 = "已初始化";
	public static final String S开始运行 = "开始运行";
	public static final String S运行中 = "运行中";
	public static final String S执行成功 = "执行成功";
	public static final String S执行异常 = "执行异常";

	public static final String E间隔时间过短 = "间隔时间过短";
	public static final String E反馈内容不正确 = "反馈内容不正确";
	public static final String E任务到期 = "任务到期";
	public static final String E任务超时 = "任务超时";
	public static final String E依赖异常 = "依赖异常";
	public static final String Esql异常 = "sql异常";
	public static final String Ecmd异常 = "cmd异常";
	public static final String Ejar异常 = "jar异常";
	public static final String Ehttp请求异常 = "http请求异常";
	public static final String E缺少配置项 = "缺少配置项";
	String _path = "";
	int waitnum = 0;
	String _msg = "";

	File file1;
	File file2;
	String _任务 = null;

	public TaskLog(String 任务) {
		_任务 = 任务;
	}

	public String getPath() {
		return _path;
	}

	public void setPath(String path) {
		this._path = path;
		file1 = new File(MyFun.join(TaskServer.getRootdir() , _path , ".txt"));
		file2 = new File(MyFun.join(TaskServer.getRootdir() , _path , "_his.txt"));

	}

	/**
	 * 把日志写入指定文件
	 */
	public synchronized void write() {
		String log = getStatusMap();
		try {
			if (My.ISDEBUG)
				System.out.println(log);
			MyFile.writeBytes(file2, true, ("\n" + log).getBytes("utf-8"));
			MyFile.writeBytes(file1, log.getBytes("utf-8"));
			
		} catch (UnsupportedEncodingException e) {
			// TODO Auto-generated catch block
			e.printStackTrace();
		}
	}

	// 、、、、、、、、、、、 依赖接口 、、、、、、、、、、、、
	/**
	 * runStatusMap 运行状态Map 属性如下: ini 表示初始化创建日期 begin 运行开始时间 end 运行结束日期 run 运行时长 毫秒
	 * err 错误信息 msg 运行消息 内容 结果 rel 依赖项
	 */
	Map<String, Object> runStatusMap = new HashMap<String, Object>();

	/** 初始化 状态集合 */
	public void f初始化任务状态() {
		// sj.备份数据库[2018-5-9 23:0:0]
		// 状态初始化
		runStatusMap.put("ini", MyDate.getStrDateTime());// 任务启动时间
		runStatusMap.put("id", 0L); // 任务id
		runStatusMap.put("name", _任务); // 任务id
		runStatusMap.put("begin", null);// 开始运行时间
		runStatusMap.put("end", null);// 开始运行时间
		runStatusMap.put("run", 0L); // 运行时长
		runStatusMap.put("err", null); // 错误内容
		runStatusMap.put("msg", S初始化任务);// 程序消息
		runStatusMap.put("内容", null); // 反馈内容
	}

	public void begin(int 第几次运行) {
		if (第几次运行 == 0) {
			runStatusMap.put("id", MyFun.getMs()); // 任务id
		}
		runStatusMap.put("第几次", 第几次运行); // 任务id
		runStatusMap.put("begin", MyDate.getStrDateTime());// 任务派发时间
		runStatusMap.put("msg", S开始运行); // 任务派发时间
		runStatusMap.put("end", null);// 任务结束时间
		runStatusMap.put("run", 0L); // 运行时长
		runStatusMap.put("err", null);// 错误提示内容
		runStatusMap.put("内容", null);// 运行反馈内容
		write();
	}

	public void end(Object 内容) {
		runStatusMap.put("err", null); // 清空异常
		runStatusMap.put("end", MyDate.getStrDateTime());
		long st=MyFun.obj2Long(runStatusMap.get("id"));		
		runStatusMap.put("run", MyFun.getMs()-st); // 运行时长
		runStatusMap.put("msg", S执行成功);
		runStatusMap.put("内容", 内容);
		write();
		
	}

	/**
	 * 设置错误内容
	 * 
	 * @param msg
	 */
	public void setErr(String err, String 内容) {
		runStatusMap.put("err", err);
		runStatusMap.put("msg", S执行异常);
		long st=MyFun.obj2Long(runStatusMap.get("id"));		
		runStatusMap.put("run", MyFun.getMs()-st); // 运行时长
		runStatusMap.put("end", MyDate.getStrDateTime());
		runStatusMap.put("内容", 内容);
		write();
	}

	public void setRels(String[] rel) {
		runStatusMap.put("rel", rel);
	}

	public void setErrTimeOut() {
		setErr(E任务超时, MyFun.getNow());
		write();
	}

	/**
	 * 判断 任务执行是否异常
	 *
	 * @return true 有"err"属性值就是异常
	 */
//	public boolean isErr() {
//		MyFun.printJson(runStatusMap);
//		// 初始化时间
//		Object d1 = runStatusMap.get("ini");
//		// 正式开始时间
//		Object d2 = runStatusMap.get("begin");
//		if (d1 == null || d2 == null)
//			return true;
//		if (d2.toString().compareTo(d1.toString()) >= 0) {		
////			String msg=MyFun.obj2Str(runStatusMap.get("msg"));
////			if (msg.contains(S执行异常)) {
////				return true;
////			}else {
//			//
//			String v = (String) runStatusMap.get("err");
//			if (MyFun.isEmpty(v))
//				return false;
//		}
//		return true;
//	}
	public boolean isErr() {
		

			String v = (String) runStatusMap.get("err");
			return !MyFun.isEmpty(v);
				
	
	}
	public String getStatusMap() {
		return JSON.toJSONString(runStatusMap);
	}
}
